Web2Py তে Raw SQL Queries এবং Stored Procedures ব্যবহারের মাধ্যমে আপনি ডাটাবেসে ডেটা ইন্টারঅ্যাকশন এবং কাস্টম কোয়েরি তৈরি করতে পারেন। যদিও Web2Py নিজে একটি ORM (Object-Relational Mapping) ব্যবহার করে, তবে কখনো কখনো Raw SQL বা Stored Procedures ব্যবহার করা প্রয়োজন হয় যখন আপনি কাস্টম ডাটাবেস লজিক বা আরও জটিল কোয়েরি চান।
এখানে Web2Py তে Raw SQL Queries এবং Stored Procedures ব্যবহারের বিস্তারিত ব্যাখ্যা দেওয়া হলো।
Web2Py তে Raw SQL Queries
Web2Py তে Raw SQL Queries ব্যবহার করা হয় যখন আপনি ডাটাবেসের সাথে সরাসরি SQL কোড লিখে ইন্টারঅ্যাক্ট করতে চান। আপনি db.executesql() মেথড ব্যবহার করে SQL কোয়েরি চালাতে পারেন।
১. Raw SQL Query ব্যবহার করা
Web2Py তে executesql() মেথড ব্যবহার করে আপনি SELECT, INSERT, UPDATE, DELETE কোয়েরি চালাতে পারেন।
উদাহরণ: SELECT Query
def get_books():
query = "SELECT title, author FROM book WHERE author = %s"
values = ('John Doe',)
rows = db.executesql(query, values)
return dict(books=rows)
এখানে:
db.executesql(query, values): এই মেথডটি কোয়েরি চালায় এবংvaluesতালিকায় সরাসরি ইনপুট ডেটা পাস করে।- SQL ইনজেকশন প্রতিরোধ করতে parameterized queries ব্যবহার করা হয়।
উদাহরণ: INSERT Query
def add_book():
title = request.vars.title
author = request.vars.author
query = "INSERT INTO book (title, author) VALUES (%s, %s)"
values = (title, author)
db.executesql(query, values)
return dict(message="Book added successfully!")
এখানে:
- INSERT INTO কোয়েরি ব্যবহার করে ডেটাবেসে নতুন বই যোগ করা হয়েছে।
- ইনপুট ডেটা parameterizedভাবে সরবরাহ করা হয়েছে, যাতে SQL ইনজেকশন প্রতিরোধ হয়।
উদাহরণ: UPDATE Query
def update_book():
book_id = request.vars.id
new_title = request.vars.title
query = "UPDATE book SET title = %s WHERE id = %s"
values = (new_title, book_id)
db.executesql(query, values)
return dict(message="Book updated successfully!")
এখানে:
- বইয়ের তথ্য আপডেট করা হয়েছে
UPDATEকোয়েরি ব্যবহার করে।
উদাহরণ: DELETE Query
def delete_book():
book_id = request.vars.id
query = "DELETE FROM book WHERE id = %s"
values = (book_id,)
db.executesql(query, values)
return dict(message="Book deleted successfully!")
এখানে:
- বই মুছে ফেলার জন্য DELETE কোয়েরি ব্যবহার করা হয়েছে।
Web2Py তে Stored Procedures
Stored Procedures হল ডাটাবেসে সংরক্ষিত SQL কোডের ব্লক যা বিভিন্ন ধরনের ডেটাবেস কার্যকলাপ সম্পাদন করতে ব্যবহৃত হয়। Web2Py তে stored procedures কল করার জন্যও db.executesql() মেথড ব্যবহার করা হয়।
২. Stored Procedure কল করা
আপনি যদি ডাটাবেসে একটি Stored Procedure তৈরি করেন, তবে আপনি executesql() মেথড ব্যবহার করে সেই স্টোরড প্রোসিজিওর কল করতে পারেন।
উদাহরণ: Stored Procedure তৈরি করা
ধরা যাক, আপনি MySQL বা PostgreSQL ডাটাবেসে একটি Stored Procedure তৈরি করেছেন, যা কোনো বইয়ের তথ্য আপডেট করে:
DELIMITER //
CREATE PROCEDURE update_book_info(IN book_id INT, IN new_title VARCHAR(255), IN new_author VARCHAR(255))
BEGIN
UPDATE book SET title = new_title, author = new_author WHERE id = book_id;
END //
DELIMITER ;
এই প্রোসিজিওরটি বইয়ের ID, নাম এবং লেখক আপডেট করতে ব্যবহৃত হবে।
উদাহরণ: Stored Procedure কল করা
Web2Py তে এই Stored Procedure কল করার জন্য executesql() ব্যবহার করা হবে:
def update_book_procedure():
book_id = request.vars.id
new_title = request.vars.title
new_author = request.vars.author
query = "CALL update_book_info(%s, %s, %s)"
values = (book_id, new_title, new_author)
db.executesql(query, values)
return dict(message="Book updated via stored procedure!")
এখানে:
CALL update_book_info(%s, %s, %s)স্টোরড প্রোসিজিওরটি কল করছে, এবং%sপ্লেসহোল্ডার ব্যবহার করে ইনপুট প্যারামিটার পাঠানো হচ্ছে।
Web2Py তে Raw SQL Query এর নিরাপত্তা
Raw SQL কোয়েরি ব্যবহার করার সময় SQL Injection প্রতিরোধ করা খুবই গুরুত্বপূর্ণ। Web2Py তে parameterized queries ব্যবহারের মাধ্যমে SQL ইনজেকশন থেকে সুরক্ষা নিশ্চিত করা হয়। যখন আপনি %s সিম্বল ব্যবহার করে SQL কোয়েরি তৈরি করেন এবং ডেটা বাইন্ড করেন, তখন Web2Py ডেটাকে সঠিকভাবে স্যানিটাইজ করে, যা SQL ইনজেকশন প্রতিরোধে সহায়তা করে।
৩. SQL Injection প্রতিরোধে ভালো অভ্যাস
%sসিম্বল ব্যবহার করুন। এটি কোয়েরি এবং ইনপুট ডেটাকে আলাদা করে রাখে এবং ইনপুটের অশুদ্ধ কোডকে নিষ্ক্রিয় করে।- কখনোই ডাইরেক্টলি ইউজারের ইনপুট সরাসরি SQL কোয়েরিতে যুক্ত করবেন না।
উদাহরণ: SQL Injection প্রতিরোধ
ভুল পদ্ধতি (SQL ইনজেকশনের জন্য বিপজ্জনক):
query = "SELECT * FROM book WHERE title = '" + request.vars.title + "'"
db.executesql(query)
সঠিক পদ্ধতি:
query = "SELECT * FROM book WHERE title = %s"
values = (request.vars.title,)
db.executesql(query, values)
সারাংশ
Web2Py তে Raw SQL Queries এবং Stored Procedures ব্যবহারের মাধ্যমে আপনি আরও জটিল এবং কাস্টম ডেটাবেস অপারেশন করতে পারেন। db.executesql() মেথডটি SELECT, INSERT, UPDATE, DELETE এবং Stored Procedures চালানোর জন্য ব্যবহৃত হয়। SQL ইনজেকশন প্রতিরোধের জন্য Web2Py তে parameterized queries ব্যবহৃত হয়, যা আপনার কোডকে আরও নিরাপদ করে তোলে।